/**
@file     	DESIGNPATTERN_ConcreteFlyweight.h
@brief    	1.When the algorithm to create complex object should be independent of the part of the object,
as well as their assembly;
2.When construction process must be allowed to construct the object is different;
@author  	arvin
@version 	1.0   2012/12/20
*/

#ifndef CXX_DESIGNPATTERN_CONCRETEFLYWEIGHT_H
#define CXX_DESIGNPATTERN_CONCRETEFLYWEIGHT_H

#ifndef CXX_DESIGNPATTERN_FLYWEIGHT_H
#include "DESIGNPATTERN_Flyweight.h"
#endif

class ConcreteFlyweight : public Flyweight
{
public:
	/**
	* Construction
	*
	* @param const string& strIntrinsicState
	* @return
	*/
	ConcreteFlyweight(const string& strIntrinsicState);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~ConcreteFlyweight();

	/**
	* Operation
	*
	* @param VOID
	* @return VOID
	*/
	virtual VOID Operation();

	/**
	* GetIntrinsicState
	*
	* @param VOID
	* @return string
	*/
	string GetIntrinsicState();

protected:
	/**
	* GetIntrinsicState
	*
	* @param const string& strIntrinsicState
	* @return VOID
	*/
	VOID SetIntrinsicState(const string& strIntrinsicState);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	ConcreteFlyweight();

	/**
	* Copy Construction
	*
	* @param const ConcreteFlyweight& cConcreteFlyweight
	* @return
	*/
	ConcreteFlyweight(const ConcreteFlyweight& cConcreteFlyweight);

	/**
	* Assignment
	*
	* @param const ConcreteFlyweight& cConcreteFlyweight
	* @return ConcreteFlyweight&
	*/
	ConcreteFlyweight& operator=(const ConcreteFlyweight& cConcreteFlyweight);

public:
protected:
private:
	string m_strIntrinsicState;
};

#endif	/* >>CXX_DESIGNPATTERN_CONCRETEFLYWEIGHT_H<< */
/* EOF */